今天我們來到了本地環境的建置,這一個部分會和 cloud build
的流程相關,因為 cloud build
所使用到的 dockerfile
是本地版本的衍生版,藉由 dockerfile
去管理環境,可以確保大幅減少環境不一致的問題。
另外也將 compose file 選用了 compose V2
的版本
Laravel Octane
和 RoadRunner
在 Stack 的選擇我用了 laravel octane
+ RoadRunner
的方式去運行 laravel
。
RoadRunner 是個使用 golang 實作的高性能 Web server,並且實作了 PSR-7,透過 Goridge 把 request 封裝成 PSR-7 Request
後轉送至 PHP 的 worker,在這個部分可以將應用常駐在記憶體中,相較於 PHP-fpm
的架構,帶來更高的效能。
在大多數的情境中,可以提供比 apache
or nginx
乘載更高的服務容量。而且可以在 autoscale 的情境中提供可接受的冷啟動 (cold start) 延遲。
定義中除了 port 8080
是為 web server
所設定的,另外也將 postgres
的 port 54321
開發出來以便本地的 client 可以直接連線至資料庫查詢。
另外如果是使用 apple silicon 的 mac 的開發者,請記得要新增platform
去指定目前使用的 image 支援的 platform,所以這邊我有指定了 linux/arm64
以下是本地環境的 Docker Compose 檔案:
services:
app:
build:
context: .
dockerfile: .deploy/local.Dockerfile
restart: unless-stopped
tty: true
depends_on:
- database
working_dir: /var/www/html
# uncomment this for running the app at start
# command: composer run rr
ports:
- "8080:8080"
volumes:
- ./:/var/www/html
networks:
- app-network
database:
image: postgres:15
platform: linux/arm64
environment:
- POSTGRES_USER=local
- POSTGRES_PASSWORD=root
- POSTGRES_DB=laravel
- PGDATA=/var/lib/postgresql/data/db-files/
volumes:
- database-vol:/var/lib/postgresql/data
ports:
- "54321:5432"
networks:
- app-network
#Docker Networks
networks:
app-network:
driver: bridge
#Volumes
volumes:
database-vol:
driver: local
這邊的 dockerfile 是前一篇文章中所提到的 api
+ base
而成的,不一樣的有這邊預先裝好了 composer 與 container 在啟動時不會自動執行 web server。
FROM php:8.2-cli-buster
ENV XDEBUG="false"
ENV COMPOSER_ALLOW_SUPERUSER=1
RUN apt-get update && \
apt-get install -y --no-install-recommends \
libz-dev \
libpq-dev \
libjpeg-dev \
libpng-dev \
libfreetype6-dev \
libssl-dev \
libmcrypt-dev \
libmagickwand-dev \
nano \
htop \
libxml2-dev \
libzip-dev \
unzip \
&& rm -r /var/lib/apt/lists/*
# Install soap extention
RUN docker-php-ext-install soap exif pcntl zip pdo_pgsql bcmath sockets
RUN MAKEFLAGS="-j $(nproc)" pecl install -o -f grpc && docker-php-ext-enable grpc
#
#------------------------------------------------------
# xDebug
#------------------------------------------------------
#
# Install the xdebug extension
#RUN pecl install xdebug && docker-php-ext-enable xdebug
# Copy xdebug configration for remote debugging
#COPY ./php/xdebug.ini /usr/local/etc/php/conf.d/xdebug.ini
#
#------------------------------------------------------
# Composer
#------------------------------------------------------
#
# Install composer and add its bin to the PATH.
RUN curl -s http://getcomposer.org/installer | php && \
echo "export PATH=${PATH}:/var/www/vendor/bin" >> ~/.bashrc && \
mv composer.phar /usr/local/bin/composer
# Source the bash
RUN . ~/.bashrc
#
#------------------------------------------------------
# Laravel Schedule Cron Job
#------------------------------------------------------
#
#RUN echo "* * * * * root /usr/local/bin/php /var/www/artisan schedule:run >> /dev/null 2>&1" >> /etc/cron.d/laravel-scheduler
#RUN chmod 0644 /etc/cron.d/laravel-scheduler
#
#------------------------------------------------------
# Final Touch
#------------------------------------------------------
#
ADD .deploy/php/local.ini /usr/local/etc/php/conf.d
RUN usermod -u 1000 www-data && groupmod -g 1000 www-data
WORKDIR /var/www
EXPOSE 8080
VOLUME ["/var/www"]
CMD ["bash"]
由於希望可以藉由 container 的環境去執行相關的建置,所以這邊先採取了將 dockefile 在 build 完後,才開始建立專案。
# Create project by composer
composer create-project laravel/laravel example-app
cp -r example-app/. .
rm -rf example-app/
# Install dependency
composer require laravel/octane
在本地環境中,我們可以安裝一些開發輔助工具來幫助我們開發 Laravel 應用。
以下是一些常用的開發輔助工具:
我們可以使用 Composer 來安裝這些開發輔助工具:
# Install dev tools
composer require --dev itsgoingd/clockwork
composer require --dev barryvdh/laravel-ide-helper
composer require --dev pestphp/pest --with-all-dependencies
這三個是我在開發時一定會使用的開發輔助工具,在輔助靜態分析、快速建立測試,到 debug 所有的 request 提供了一個透明度高的細節,讓開發不再痛苦又撞牆。